package com.forum.module.system.api.user;

import com.forum.framework.common.pojo.DataResult;
import com.forum.module.system.api.user.dto.AdminUserRespDTO;
import com.forum.module.system.enums.ApiConstants;
import feign.FeignIgnore;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * 管理员用户 API 接口
 *
 * @author zihan.ouyang
 */
@FeignClient(name = ApiConstants.NAME)
@Tag(name = "认证服务 HTTP API - 用户信息")
@Validated
public interface AdminUserApi {

    String PREFIX = ApiConstants.PREFIX + "/user";

    /**
     * 通过用户 ID 查询用户
     *
     * @param id 用户ID
     * @return 用户对象信息
     */
    @GetMapping(PREFIX + "/get")
    @Operation(summary = "通过用户 ID 查询用户")
    @Parameter(name = "id", description = "用户编号", example = "1", required = true)
    DataResult<AdminUserRespDTO> getUserById(@RequestParam("id") Long id);


    /**
     * 通过用户 ID 查询用户们
     *
     * @param ids 用户 ID 们
     * @return 用户对象信息
     */
    @GetMapping(PREFIX + "/listByIds")
    @Operation(summary = "通过用户 ID 查询用户们")
    @Parameter(name = "ids", description = "部门编号数组", example = "1,2", required = true)
    DataResult<List<AdminUserRespDTO>> getUserList(@RequestParam("ids") Collection<Long> ids);

    @GetMapping(PREFIX + "/list")
    @Operation(summary = "查询所有用户")
    List<AdminUserRespDTO> getUserList();

    /**
     * 校验用户是否有效。如下情况，视为无效：
     * 1. 用户编号不存在
     * 2. 用户被禁用
     *
     * @param id 用户编号
     */
    @FeignIgnore
    default void validateUser(Long id) {
        validateUserList(Collections.singleton(id));
    }

    /**
     * 校验用户们是否有效。如下情况，视为无效：
     * 1. 用户编号不存在
     * 2. 用户被禁用
     *
     * @param ids 用户编号数组
     */
    @FeignIgnore
    void validateUserList(Collection<Long> ids);
}
